package com.lb.annotationmapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.mapping.StatementType;
import org.springframework.transaction.annotation.Transactional;

@SuppressWarnings("all")
public interface BaseMapperAnnotation {
    //常用泛型的注解功能
    @Select("select  *  from  ${tableName}")
    public List<Map> findAll(@Param("tableName") String tableName);

    @Select("select * from ${tableName} where id=#{id}")
    public Map findById(@Param("tableName") String tableName, @Param("id") String id);

    @Transactional
    @Delete("delete from ${tableName} where id=#{id}")
    public int deleteObject(@Param("tableName") String tableName, @Param("id") String id);

    //根据sql方式的注解功能
    @Transactional
    @Insert("${sql}")
    public int insertBySqlObject(@Param("sql") String sql);

    @Transactional
    @Update("${sql}")
    public int updateBySqlObject(@Param("sql") String sql);

    @Transactional
    @Delete("${sql}")
    public int deleteBySqlObject(@Param("sql") String sql);

    /**
     * * 根据自己写的sql自行处理,及占位符，可支持模糊查询或多表，不固定动态sql条件。
     * 例sql：
     * SELECT * FROM  sys_user WHERE id=#{id} and name=#{name}
     * pojo：key id,name
     *
     * @param 设定
     * @return
     * @Description: TODO(描述)
     * @author 作者 jacking
     * @date 2017-6-16 上午9:42:57
     */
    @Select("${sql}")
    public List<Map> findBySqlMore(@Param("sql") String sql, @Param("pojo") Map data);

    /**
     * 根据自己写的countsql自行处理,及占位符，可支持模糊查询或多表，不固定动态sql条件。
     *
     * @param @param  sql
     * @param @param  data
     * @param @return 设定文件
     * @return long    返回类型
     * @throws
     * @Title: findCountBySql
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    @Select("${countsql}")
    public long findCountBySql(@Param("countsql") String sql, @Param("pojo") Map data);

    /**
     * 根据自己写的sql自行处理,及占位符，可支持模糊查询或多表，不固定动态sql条件。
     * 例sql：
     * SELECT * FROM  sys_user WHERE id=#{pojo.id} and name=#{pojo.name}
     * pojo：key id,name
     *
     * @param 设定
     * @return
     * @Description: TODO(描述)
     * @author 作者 jacking
     * @date 2017-6-16 上午9:38:48
     */
    @Select("${sql}")
    public Map findBySqlUnique(@Param("sql") String sql, @Param("pojo") Map data);

    /**
     * *l例： select * from sys_user where 1=1 <if test=\"pojo.id != null and id!=''\"  > and id=#{pojo.id}  </if>
     *
     * @param 设定
     * @return
     * @Description: TODO(描述)
     * @author 作者 jacking
     * @date 2017-6-16 上午11:12:48
     */
    @Select("<script>${scriptSql}</script>")
    public List<Map> findByScriptSqlMore(@Param("scriptSql") String scriptSql, @Param("pojo") Map data);

    /**
     * *l例： select * from sys_user where 1=1 <if test=\"pojo.id != null and id!=''\"  > and id=#{pojo.id}  </if>
     *
     * @param 设定
     * @return
     * @Description: TODO(描述)
     * @author 作者 jacking
     * @date 2017-6-16 上午11:12:48
     */
    @Select("<script>${scriptSql}</script>")
    public Map findByScriptSqlUnique(@Param("scriptSql") String scriptSql, @Param("pojo") Map data);

    @Select("<script>"
            + "select * from sys_user where 1=1 <if test=\"id != null and id!=''\"  > and id=#{id}  </if>" +
//  +"select * from sys_user where 1=1 <if test=\"#{id} != null and #{id}!=''\"  > and id=#{id}  </if>" +
            " </script>")
    public List<Map> findTestByScript(@Param("id") String id);

    /**
     * delete from sys_user where pojo.id='784972358981328902'
     *
     * @param 设定
     * @return
     * @Description: TODO(描述)
     * @author 作者 jacking
     * @date 2017-6-16 上午11:21:55
     */
    @Transactional
    @Update("<script>${scriptSql}</script>")
    public int excuteByScriptSql(@Param("scriptSql") String scriptSql, @Param("pojo") Map data);

    /**
     * delete from sys_user where pojo.id='784972358981328902'
     *
     * @param 设定
     * @return
     * @Description: TODO(描述)
     * @author 作者 jacking
     * @date 2017-6-16 上午11:21:42
     */
    @Transactional
    @Update("${sql}")
    public int excuteBySql(@Param("sql") String sql, @Param("pojo") Map data);

    @Transactional
	/*@Update("<script>"
	   +"delete from sys_user where id='784972358981328903'" +
//  +"select * from sys_user where 1=1 <if test=\"#{id} != null and #{id}!=''\"  > and id=#{id}  </if>" +
	   " </script>")*/
    @Update("${sql}")
    public int excuteBySqlTest(@Param("sql") String sql);

    @Select("select 123456")
    public String findTest();

    /**
     * 调用存储过程,return Map
     * callsql:
     * 例：@Select("call  procedureName()")
     * call procedureName(#{pojo.totalNum,jdbcType=INTEGER,mode=OUT},#{pojo.tableName,jdbcType=STRING,mode=IN},#{pojo.conditions,jdbcType=STRING,mode=IN})
     */
    @Select("${callSql}")
    @Options(statementType = StatementType.CALLABLE)
    public Map findByCallSql2Map(@Param("callSql") String callSql, @Param("pojo") Map data);

    /**
     * 调用存储过程,return List
     * callsql:
     * 例：@Select("call  procedureName()")
     * call procedureName(#{pojo.totalNum,jdbcType=INTEGER,mode=OUT},#{pojo.tableName,jdbcType=STRING,mode=IN},#{pojo.conditions,jdbcType=STRING,mode=IN})
     */
    @Select("${callSql}")
    @Options(statementType = StatementType.CALLABLE)
    public List findByCallSql2List(@Param("callSql") String callSql, @Param("pojo") Map data);

    /**
     * 调用存储过程
     * callsql:
     * 例：@Update("call  procedureName()")
     * call procedureName(#{pojo.totalNum,jdbcType=INTEGER,mode=OUT},#{pojo.tableName,jdbcType=STRING,mode=IN},#{pojo.conditions,jdbcType=STRING,mode=IN})
     */
    @Transactional
    @Update("${callSql}")
    @Options(statementType = StatementType.CALLABLE)
    public int excuteByCallSql(@Param("callSql") String callSql, @Param("pojo") Map data);

    /**
     * 调用存储过程返回数据列表
     *
     * @param @param  callSql
     * @param @param  data
     * @param @return 设定文件
     * @return List    返回类型
     * @throws
     * @Title: excuteByCallSql2List
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    @Transactional
    @Update("${callSql}")
    @Options(statementType = StatementType.CALLABLE)
    public List excuteByCallSql2List(@Param("callSql") String callSql, @Param("pojo") Map data);

    /**
     * 调用存储过程返回数据Map(存储过程须指定列名)
     *
     * @param @param  callSql
     * @param @param  data
     * @param @return 设定文件
     * @return Map    返回类型
     * @throws
     * @Title: excuteByCallSql2Map
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    @Transactional
    @Update("${callSql}")
    @Options(statementType = StatementType.CALLABLE)
    public Map excuteByCallSql2Map(@Param("callSql") String callSql, @Param("pojo") Map data);

    /**
     * 调用存储过程返回数据数组（适用未指定列名）
     *
     * @param @param  callSql
     * @param @param  data
     * @param @return 设定文件
     * @return String[]    返回类型
     * @throws
     * @Title: excuteByCallSql2Array
     * @Description: TODO(这里用一句话描述这个方法的作用)
     */
    @Transactional
    @Update("${callSql}")
    @Options(statementType = StatementType.CALLABLE)
    public String[] excuteByCallSql2Array(@Param("callSql") String callSql, @Param("pojo") Map data);
}